package com.ce.sys.auth;

import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import com.ce.framework.auth.Authentication;
import com.ce.framework.util.StringUtil;
import com.ce.sys.login.model.User;
import com.ce.sys.role.dao.po.SysRolePermiss;
import com.ce.util.DbUtil;
import com.ce.util.MenuUtil;

/**
 * 嫦娥软件有限公司 版权所有 2013
 * 创建人： andy
 * 创建时间： 2013-11-1 下午02:16:58
 * 功能描述：访问菜单的权限验证类
 * ==================================
 * 修改历史
 * 修改人        修改时间      修改位置（函数名）
 *
 * ==================================
 */
public class SysAuthentication extends Authentication {

	@Override
	public boolean checkAuth(String path, HttpServletRequest request) {
		try {			
			
			//当前用户请求的操作名称（add，modify等）
			String authOp = MenuUtil.analyseUrlToOperator(path);
			//从request中获取访问页面的地址，解析成对应的菜单地址
			String menuPath = MenuUtil.analyseUrlToMenuUrl(path);
			//获取菜单地址对应的菜单ID
			String menuId = MenuUtil.getMenuId(menuPath);
			//没有菜单id时默认该地址可以访问
			if(StringUtil.isBlank(menuId))
				return true;
			else if(request!=null){
				request.setAttribute("menuId", menuId);
			}
			User user = User.getUser(request);
			if(user==null){
				return false;
			}
			//登陆用户为超级管理员时默认拥有所有权限
			if(user.isSuperUser()){
				return true;
			}
			//获取当前用户所在角色对应的该菜单的所有操作项目
			List<?> permissList  = DbUtil.executeHql("from SysRolePermiss po where (po.vcRoleId = 'common' or po.vcRoleId in " +
					"( select r.vcRoleId from SysAccountRole r where r.vcUserId = '"+user.getVcId()+"'))" +
				    " and po.vcMenuId = '"+menuId+"'");
			
			//================判断用户是否具有该菜单的访问权限==========================================
			if(permissList==null||permissList.size()==0)
				return false;

			//================判断当前获取的操作名称是否在菜单功能权限里==================================
			String allMenuOpts = ","+MenuUtil.getMenuAllOpts(menuId)+",";  //当前菜单所具有的所有操作功能 
			if((allMenuOpts.length()>2&&allMenuOpts.indexOf(","+authOp+",")<0)||",,".equals(allMenuOpts)) //如果请求的权限不在菜单所提供的功能范围之内或者该菜单没有操作功能，及认为有权限
				return true;
			
			//================判断用户是否具有该菜单的操作权限==========================================
			if(StringUtil.isNotBlank(authOp)){
				String cruRoleOpts = ",";   //当前角色对该菜单具有的操作功能操作名称
				Iterator<?> it = permissList.iterator();
				while(it.hasNext()){
					SysRolePermiss permiss = (SysRolePermiss)it.next();
					if(StringUtil.isNotBlank(permiss.getVcOperation()))
						cruRoleOpts = cruRoleOpts + permiss.getVcOperation()+",";
				}
				if(cruRoleOpts.indexOf(","+authOp+",")>=0)
					return true;
			}else if(StringUtil.isBlank(authOp)){ //有菜单访问权限但是没有操作名称时，设置为有权限
				return true;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}

}
